地图要素编辑 离线地图要素编辑Sample 在线地图要素编辑Sample

最后更新时间:2019年7月5日

地图要素编辑即对二维地图要素(点、线、区、注记)的添、删、改编辑功能。可以对移动端设备本地存储的离线数据进行编辑,也可以在联网状态下直接对在线地图服务、图层服务进行要素编辑。

要素添加

要素添加功能实现的关键步骤如下图所示:

要素添加实现流程.jpg

(1) 构造要素编辑对象(MGSFeatureEdit);

(2) 构造要素对象的三要素,包括属性(NSDictionary)、几何信息(MGSGeometry)、样式信息(MGSGeomInfo);

(3) 根据三要素创建要素(MGSFeature);

(4) 调用要素编辑对象MGSFeatureEdit的append方法执行添加要素。

接下来以离线地图数据点要素添加为例展示具体实现方法:

1

构造要素编辑对象

构造要素编辑要素对象有四种方式,根据应用模式分为离线数据编辑和在线数据编辑。用户可根据需求选择相应的方式。

(1)离线数据

//获取矢量图层
MGSVectorLayer *vectorLayer = (MGSVectorLayer *)[_mapView.map getLayerAtIndex:i];
//构造要素编辑对象
MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithVectorLayer:vectorLayer];
//构造数据库对象
MGSDataBase *dataBase=[[MGSDataBase alloc] init];
//.mgdb数据库离线本地路径
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Map/MapEdit/武汉MKT.mgdb"];
//打开数据库
[dataBase open:dbPath];
//通过数据库初始化简单要素类
MGSSFeatureCls *featureCls=[[MGSSFeatureCls alloc] initWithDataBase:dataBase];
//打开要素图层
[featureCls openWithID:i]; //从1开始
//构造要素编辑对象(通常在只提供.mgdb数据库时使用)
MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithIVectorCls:featureCls];

(2)在线数据

在线数据编辑,首先需要在IGServer发布地图文档数据(.mapx),发布成功后获取地图文档信息,如地图文档名称、地图文档基地址、图层索引、图层URL等。在运行要素编辑功能时,需要确保设备网络与IGServer服务器网络连通。

//根据服务基地址、图层URL构造要素编辑对象
MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithIGServerBaseURL:@"http://develop.smaryun.com:6163/igs" dataURL:@"gdbp://MapGisLocal/武汉MKT/sfcls/自绘点"];
//根据服务基地址、地图文档名称、地图索引、图层索引构造要素编辑对象
MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithIGServerBaseURL:@"http://develop.smaryun.com:6163/igs" docName:@"WuHanEdit" mapID:0 layer:8];

2

构造要素三要素

包括属性信息(NSDictionary)、几何信息(MGSGeometry)、样式信息(MGSGeomInfo)。

NSDictionary<NSString *,NSString *> *pointAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"自定义站", @"Name", nil];  //属性值以键值对形式存在
//几何点对象
MGSGeoPoint *geoPoint=[[MGSGeoPoint alloc] init];
//坐标点
MGSDot3D dot=MGSDot3DMake(12727052.60, 3578030.02, 0);
[geoPoint setDot3D:dot];
//点样式信息对象
MGSPntInfo *pntInfo=[[MGSPntInfo alloc] init];
[pntInfo setWidth:600];    //宽
[pntInfo setHeight:600];   //高
[pntInfo setSymID:177];    //符号编号
[pntInfo setOutClr1:6];    //颜色

重要说明:(1)设置的符号编号、颜色值是根据离线地图数据系统库中的符号库、颜色库来决定的(2)地图要素包括点、线、区、注记四种基本类型,具体可以分解为多种几何类型,在接口层面上,它们对应不同的几何对象类、样式信息类。如下图所示:

几何对象、样式信息类型.png

3

创建要素

根据三要素创建地图要素。

MGSFeature *pointFeature=[[MGSFeature alloc] initWithAttributes:pointAtt geometry:geoPoint geoInfo:pntInfo];

4

添加要素

调用要素编辑对象的append方法执行添加要素,并对添加结果进行判断。

//执行点要素的添加操作
long s=[_featureEdit append:pointFeature];
if (s>0) {
    NSLog(@"添加点要素成功");
    //刷新地图
    [_mapView forceRefresh];
} else {
    NSLog(@"添加点要素失败");
}


以上是点要素添加的整个流程,线、区、注记要素的添加实现方法基本一致,区别构造要素对象的三要素方式不同,如下所示:

//属性信息
NSDictionary<NSString *,NSString *> *lineAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"1道路", @"Name_chn", nil];

//几何信息
MGSGeoVarLine *geoVarLine=[[MGSGeoVarLine alloc] init];
MGSDots *dots=[[MGSDots alloc] init];
MGSDot dot1=MGSDotMake(12718853.57, 3583174.04);
MGSDot dot2=MGSDotMake(12718935.33, 3574794.53);
MGSDot dot3=MGSDotMake(12725802.44, 3571647.10);
[dots appendDot:dot1];
[dots appendDot:dot2];
[dots appendDot:dot3];
[geoVarLine setDots2D:dots];

//样式信息
MGSLinInfo *linInfo=[[MGSLinInfo alloc] init];
[linInfo setOutClr1:2];   //颜色
//属性信息
NSDictionary<NSString *,NSString *> *polygonAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"自定义水域", @"Name", nil];

//几何信息
MGSGeoPolygon *geoPolygon=[[MGSGeoPolygon alloc] init];
MGSDots *dots=[[MGSDots alloc] init];
MGSDot dot1=MGSDotMake(12723229.57, 3570597.11);
MGSDot dot2=MGSDotMake(12725877.54, 3569563.15);
MGSDot dot3=MGSDotMake(12722750.42, 3564973.34);
MGSDot dot4=MGSDotMake(12719875.49, 3566032.53);
[dots appendDot:dot1];
[dots appendDot:dot2];
[dots appendDot:dot3];
[dots appendDot:dot4];
[dots appendDot:dot1];
MGSIntList *intList=[[MGSIntList alloc] init];
[intList append:(int)dots.size];
[geoPolygon setDots:dots numList:intList];

//样式信息
MGSRegInfo *regInfo=[[MGSRegInfo alloc] init];
[regInfo setFillClr:7];   //填充颜色
//属性信息
NSDictionary<NSString *,NSString *> *annoAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"长江", @"Name", nil];

//几何信息
MGSTextAnno *textAnno=[[MGSTextAnno alloc] init];
MGSDot dot=MGSDotMake(12730310.39, 3586141.71);
[textAnno setAnchorDot:dot];
[textAnno setText:@"长江"];

//样式信息
MGSTextAnnInfo *textAnnInfo=[[MGSTextAnnInfo alloc] init];
[textAnnInfo setColor:4];
[textAnnInfo setHeight:1000];
[textAnnInfo setWidth:1000];

要素添加的展示效果如下图所示:

添加点.jpg 添加线.jpg 添加区.jpg 添加注记.jpg


要素修改

要素修改,包括对地图要素(点、线、区、注记)的属性、几何以及样式信息的编辑,实现的关键步骤如下图所示:

要素修改实现流程.png

(1) 构造要素编辑对象(MGSFeatureEdit);

(2) 获取待修改要素的ID:获取方式有多种,可以利用地图查询功能获取(通过要素类MGSFeature的ID属性获取)。

(3) 构造要素对象需修改的三要素:几何信息、属性信息、几何图形信息;

(4) 修改要素:调用MGSFeature类的modifyFeatureValue:geometry:info:方法修改;

(5) 要素更新:调用要素编辑对象MGSFeatureEdit的update:ID:方法执行更新,并对修改结果进行判断。

//对要素修改属性、几何、样式信息
long a=[modifyFeature modifyFeatureValue:pointAtt geometry:geoPoint info:pntInfo];
if (a>0) {
    //更新要素
    long b=[_featureEdit update:modifyFeature ID:id];
    if (b>0) {
        NSLog(@"修改要素成功");
        //强制刷新地图
        [_mapView forceRefresh];
    } else {
        NSLog(@"修改要素失败");
    }
}
else NSLog(@"要素更新值失败");

说明:在修改要素时,如果只需要对要素的属性、几何、样式信息中的部分信息进行修改,只需传入对应的信息对象即可,其他信息可传nil。

要素删除

要素删除,同样分为点、线、区、注记要素的删除。要素删除通过要素的唯一标识ID定位要素,执行删除。要素删除功能实现的关键步骤如下图所示:

要素删除实现流程.png

(1) 构造要素编辑对象(MGSFeatureEdit);

(2) 获取要删除的要素的ID:要素ID一般通过地图要素查询方法获取;

(3) 要素删除:调用要素编辑对象的deleteWithID:方法执行删除要素,并对删除结果进行判断。

//删除要素
long s=[_featureEdit deleteWithID:id];
if (s>0) {
    NSLog(@"删除要素成功");
    [_mapView forceRefresh];
} else {
    NSLog(@"删除要素失败");
}

交互式要素编辑 Sample详情

在实际项目应用中,经常采用交互式的要素编辑操作,这样能够使得应用更简便、易用、高效、实用。交互要素编辑,其实也就是地图手势事件与要素编辑两部分功能的结合。具体代码在此不展开讲述,可参考示例中心的示例。实现效果如下:

交互式要素编辑.jpg